package com.free.semantic.core;

import com.free.semantic.common.*;
import com.free.semantic.facade.Link;
import com.free.semantic.facade.Node;
import com.free.semantic.req.RelaItemDef;
import com.free.semantic.req.RelationDefine;

import java.util.List;
import java.util.Map;

/**
 * 包含一个语义网络的定义
 */
public interface ConceptManage {

    /**
     * 增加事物
     *
     * @param concept 事物列表
     */
    void addConcept(String... concept);

    /**
     * 实例化一个关系，所有操作关系链的函数都应该返回当前版本
     *
     * @param relationName 关系名称
     * @param objNameMap   名称映射表
     * @return 创建关系是否成功
     */
    boolean instanceRelation(String relationName, Map<String, String> objNameMap);

    /**
     * 实例化一个关系
     *
     * @param relationItems 要实例化的关系，不要使用
     * @return 创建关系是否成功
     */
    boolean instanceRelation(List<RelationItem> relationItems);

    /**
     * 增加关系定义
     *
     * @param relationName    关系名称
     * @param relaItemDefines 关系定义
     */
    void addRelationDefine(String relationName, List<RelaItemDef> relaItemDefines);

    /**
     * 为了应对分支增加后的，以前查询失败问题，增加了分支概念，获取当前版本
     *
     * @return 获取最新版本
     */
    int getLastVersion();

    /**
     * 增加版本
     */
    int increaseVersion();

    /**
     * 网络融合后进行概念合并
     *
     * @param sourceFrom
     * @param destFrom
     * @param sourceTo
     * @param destTo
     */
    void conceptMergeTo(List<String> sourceFrom, String destFrom, List<String> sourceTo, String destTo);

    @Deprecated
    List<RelationChain> findAllRelationChain(List<String> sourceObj, String destObj);

    @Deprecated
    List<RelationChain> findExactRelationChain(List<String> sourceObj, String destObj);

    @Deprecated
    List<RelationChain> findAllRelationChain(int version, List<String> sourceObj, String destObj);

    @Deprecated
    List<RelationChain> findExactRelationChain(int version, List<String> sourceObj, String destObj);

    List<RelationChain> findAllRelationChain(List<RangeObj> sourceObj, RangeObj destObj);

    List<RelationChain> findAllRelationChain(List<RangeObj> sourceObj, RangeObj destObj, int version);

    List<RelationChain> findExactRelationChain(List<RangeObj> sourceObj, RangeObj destObj);

    List<RelationChain> findExactRelationChain(List<RangeObj> sourceObj, RangeObj destObj, int version);

    RelationChain findChainByLocatorNode(List<BaseNode> sourceObj, RangeObj destObj);

    RelationChain findChainByLocatorNode(List<BaseNode> sourceObj, RangeObj destObj, int version);

    List<String> findAllConnectByRelation(List<String> sourceObj, String relationName);

    List<RelationInstance> getAllInstance();

    List<String> getAllObjects();

    /**
     * 按照名称正序排序获取事物列表
     *
     * @return 根事物
     */
    List<String> findAllRootObjectList();

    List<RelationItem> getGoRelationByObject(String name);

    List<RelationItem> getBackRelationByObject(String name);

    List<RelationInstance> getDirectRelationIns(String name);

    List<Node> getAllNode();

    List<Link> getAllLink();

    List<RelationDefine> getAllRelationDefine();

    List<RelationInstance> getAllRelationInstance();

    /**
     * 维持事物关系不变的情况下，通过中间概念进行链接
     * 暂时简化下case，创建的中间关系，来源事物的数量范围为1
     * <p>
     * A->B 修改为  A->C->D->B
     *
     * @param source
     * @param dest
     * @param middleObj
     */
    void addLineObjectBetweenRelationItem(List<String> source, String dest, List<RangeObj> middleObj);

    /**
     * 维持事物关系不变的情况下，通过中间概念进行链接
     * <p>
     * A->B 修改为  A->C A->D (C,D)->B
     *
     * @param source
     * @param dest
     * @param middleObj
     */
    void addObjectBetweenRelationItem(String source, String dest, List<RangeObj> middleObj);

    /**
     * 移除关系
     *
     * @param source
     * @param dest
     */
    void removeRelationItem(List<String> source, String dest);

    /**
     * 移除关系
     *
     * @param objectName
     */
    void removeObject(List<String> objectName);

}
